<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 定义一个带有递归的函数，实现对象的深度拷贝。

        // 定义一个拷贝数据的函数(深度拷贝)
        function myClone(data){
            // 判断data是否是引用数据类型？需要深度拷贝的
            if (data instanceof Object && data !== null){
                // 声明一个新的空数据，用于存放复制内容
                const res = Array.isArray(data)? [] : {};
                // 遍历被复制的数据data
                for(let k in data){
                    // 复制每个元素值，将被复制的数据使用myClone过一下（若是对象还会进行子复制）
                    res[k] = myClone(data[k]); // 此处为函数自调用（递归调用）
                }
                // 返回结果
                return res;
            } else {
                 return data;
            }
        }

        // 二维数组的复制（克隆）
        const a1 = [10,20,[30,40]];
        const b1 = myClone(a1);
        a1[2][1] = 60;
        console.log(b1);
        console.log(a1 === b1);
        console.log(a1[2] === b1[2]);

        const ob1 = {
            books: [[
                'JavaScript权威指南',
                { author: '小淘', price: 69.50 }
            ],[
                'JavaScript高级程序设计',
                { author: '小王', price: 91.80 }
            ]]
        };

        const ob2 = myClone(ob1);
        console.log(ob2);
        console.log(ob1.books === ob2.books);
        console.log(ob1.books[1][1] === ob2.books[1][1]);
        console.log(ob1.books[0][1] === ob2.books[0][1]);
        
        
        
        /*
        const arr1 = [10,20,30];
        const ob1 = {name:"zhangsan",age:20};
        const m = 100;

        // 测试
        const s1 = myClone(arr1);
        console.log(s1);
        console.log(s1 === arr1); // false
        const s2 = myClone(ob1);
        console.log(s2);
        console.log(s2 === ob1); // false
        

        console.log(myClone(100));
        */
    </script>
</body>
</html>